<html>
    <head>
        <title>PHamlP Test Suite</title>
        <link rel="stylesheet" type="text/css" href="test.css">
    </head>
    <body>
        <?php
        /**
         * This file is horrible and not Drupal at all. Forgive me, I did not have time to write concise code.
         */
        /* Testing for Sassy.
         *  Looks in tests* and compiles any .sass/.scss files
         *  and compares to them to their twin .css files by
         *  filename.
         *
         *  That is, if we have three files:
         *     test.scss
         *     test.sass
         *     test.css
         *
         *  The tester will compile test.scss and test.sass seperately
         *  and compare their outputs both to each other and to test.css
         *
         *  Testing is eased by stripping out all whitespace, which may
         *  introduce bugs of their own.
         */
        include 'SassParser.php';

        $test_dir = './tests';

        $files = find_files($test_dir);

        $i = 0;

        foreach ($files['by_name'] as $name => $test) {
            if (isset($_GET['name']) && $name != $_GET['name']) {
                continue;
            }
            if (isset($_GET['skip']) && $name && preg_match('/(^|,)(' . preg_quote($name) . ')(,|$)/', $_GET['skip'])) {
                continue;
            }
            if (count($test) > 1) {
                $result = test_files($test, $test_dir);

                if ($result === TRUE) {
                    print "\n\t<p class='pass'><em>PASS</em> $name</p>";
                } else {
                    print "\n\t<p class='fail'><em>FAIL</em> $name</p>";
                    print "<pre>$result</pre>";
                }
                flush();

                if ($i++ == 100) {
                    die;
                }
            }
        }

        function test_files($files, $dir = '.')
        {
            sort($files);
            foreach ($files as $i => $file) {
                $name = explode('.', $file);
                $ext = array_pop($name);

                $fn = 'parse_' . $ext;
                if (function_exists($fn)) {
                    try {
                        $result = $fn($dir . '/' . $file);
                    } catch (Exception $e) {
                        $result = $e->__toString();
                    }
                    file_put_contents('/tmp/scss_test_' . $i, trim($result) . "\n");
                }
            }

            $diff = exec('diff -ibwB /tmp/scss_test_0 /tmp/scss_test_1', $out);
            if (count($out)) {
                if (isset($_GET['full'])) {
                    $out[] = "\n\n\n" . $result;
                }
                return implode("\n", $out);
            } else {
                return TRUE;
            }
        }

        function parse_scss($file)
        {
            return __parse($file, 'scss');
        }

        function parse_sass($file)
        {
            return __parse($file, 'sass');
        }

        function parse_css($file)
        {
            return file_get_contents($file);
        }

        function __parse($file, $syntax, $style = 'nested')
        {
            $options = array(
                'style' => $style,
                'cache' => FALSE,
                'syntax' => $syntax,
                'debug' => FALSE,
                'callbacks' => array(
                    'warn' => 'cb_warn',
                    'debug' => 'cb_debug',
                ),
            );
            // Execute the compiler.
            $parser = new SassParser($options);
            return $parser->toCss($file);
        }

        function cb_warn($message, $context)
        {
            print "<p class='warn'>WARN : ";
            print_r($message);
            print "</p>";
        }

        function cb_debug($message)
        {
            print "<p class='debug'>DEBUG : ";
            print_r($message);
            print "</p>";
        }

        function find_files($dir)
        {
            $op = opendir($dir);
            $return = array('by_type' => array(), 'by_name' => array());
            if ($op) {
                while (false !== ($file = readdir($op))) {
                    if (substr($file, 0, 1) == '.') {
                        continue;
                    }
                    $name = explode('.', $file);
                    $ext = array_pop($name);
                    $return['by_type'][$ext] = $file;
                    $name = implode('.', $name);
                    if (!isset($return['by_name'][$name])) {
                        $return['by_name'][$name] = array();
                    }
                    $return['by_name'][$name][] = $name . '.' . $ext;
                }
            }
            asort($return['by_name']);
            asort($return['by_type']);
            return $return;
        }
        ?>
    </body>
</html>
